﻿#include<iostream>
using namespace std;

//class Person
//{
//public:
//	//加virtual构成虚函数
//	virtual void BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//	}
//};

//class Person
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//	}
//};
//
//class Student :public Person
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "买票-打折" << endl;
//	}
//};
//
//void Func(Person* ptr)
//{
//	//虽然Person类指针ptr在调用BuyTicket
//	//实际跟ptr无关，只由ptr指向的对象决定
//	ptr->BuyTicket();
//}
//
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//
//	return 0;
//}

//class Animal
//{
//public:
//	virtual void talk() const
//	{}
//};
//
//class Dog :public Animal
//{
//public:
//	virtual void talk() const
//	{
//		cout << "汪汪" << endl;
//	}
//};
//
//class Cat :public Animal
//{
//public:
//	virtual void talk() const
//	{
//		cout << "喵喵" << endl;
//	}
//};
//
//void letsHear(const Animal& animal)//基类的引用
//{
//	animal.talk();
//}
//
//int main()
//{
//	Dog dog;
//	Cat cat;
//	letsHear(dog);
//	letsHear(cat);
//
//	return 0;
//}

//class A
//{
//public:
//	virtual void func(int val = 1)
//	{
//		cout << "A->" << val << endl;
//	}
//
//	virtual void test()
//	{
//		func();
//	}
//};
//
//class B :public A
//{
//public:
//	void func(int val = 0)
//	{
//		cout << "B->" << val << std::endl;
//	}
//};
//
//int main()
//{
//	B* p = new B;
//	p->test();
//
//	return 0;
//}

//class A
//{};
//
//class B :public A
//{};
//
//class Person
//{
//public :
//	virtual A* BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//		return nullptr;
//	}
//};
//
//class Student :public Person
//{
//public:
//	virtual B* BuyTicket()
//	{
//		cout << "买票-打折" << endl;
//		return nullptr;
//	}
//};
//
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//
//	return 0;
//}

//class A
//{
//public:
//	 ~A()
//	{
//		cout << "~A()" << endl;
//	}
//};
//
//class B :public A
//{
//public:
//	 ~B()
//	{
//		cout << "~B->delete:" << _p << endl;
//		delete[] _p;
//	}
//
//protected:
//	int* _p = new int[10];
//};
//
//// 只有派⽣类B的析构函数重写了A的析构函数，下⾯的delete对象调⽤析构函数，
//// 才能构成多态，才能保证p1和p2指向的对象正确的调⽤析构函数。 
//int main()
//{
//	A* p1 = new A;
//	B* p2 = new B;
//	delete p1;
//	delete p2;//调用~B后默认还会调用父类的~A
//
//	return 0;
//}

//class Car
//{
//public:
//	virtual void Dirve()
//	{}
//};
//
//class Benz :public Car
//{
//public:
//	virtual void Drive() override
//	{
//		cout << "Benz;舒适" << endl;
//	}
//};
//


//class Car
//{
//public:
//	//final声明的虚函数无法被重写
//	virtual void Drive() final
//	{}
//};
//
//class Benz :public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};

//class Car
//{
//public:
//	virtual void Drive() = 0;
//};
//
//class Benz :public Car
//{
//public:
//	virtual	void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//
//class BMW :public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "BMW-操控" << endl;
//	}
//};
//
//int main()
//{
//	Car car;
//	Car* pBenz = new Benz;
//	pBenz->Drive();
//	Car* pBMW = new BMW;
//	pBMW->Drive();
//
//	return 0;
//}

//class Base
//{
//public:
//	virtual void Fun1()
//	{
//		cout << "Fun1()" << endl;
//	}
//protected:
//	int _b = 1;
//	char _ch = 'x';
//};
//
//int main()
//{
//	Base b;
//	cout << sizeof(b) << endl;
//
//	return 0;
//}

//class Person
//{
//public:
//	void BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//	}
//private:
//	string _name;
//};
//
//class Student :public Person
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "买票-打折" << endl;
//	}
//private:
//	string _id;
//};
//
//class Soldier :public Person
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "买票-优先" << endl;
//	}
//private:
//	string _codename;
//};
//
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//
//int main()
//{
//	Person ps;
//	Student st;
//	Soldier sr;
//	Func(&ps);
//	Func(&st);
//	Func(&sr);
//
//	return 0;
//}

//class Base
//{
//public:
//	virtual void fun1() { cout << "Base::func1()" << endl; }
//	virtual void fun2() { cout << "Base::func2()" << endl; }
//	void func5() { cout << "Base::func5()" << endl; }
//protected:
//	int a = 1;
//};
//
//class Derive :public Base
//{
//	virtual void fun1() { cout << "Derive::func1()" << endl; }//重写
//	virtual void fun3() { cout << "Derive::func3()" << endl; }
//	void func4() { cout << "Derive::func4()" << endl; }
//protected:
//	int b = 2;
//};
//
//int main()
//{
//	int i = 0;
//	static int j = 1;
//	int* p1 = new int;
//	const char* p2 = "xxxxxxx";
//	printf("栈:%p\n", &i);
//	printf("静态区:%p\n", &j);
//	printf("堆:%p\n", p1);
//	printf("常量区:%p\n", p2);
//
//	Base b;
//	Derive d;
//	Base* p3 = &b;
//	Derive* p4 = &d;
//	printf("Person虚表地址:%p\n", *(int*)p3);
//	printf("Student虚表地址:%p\n", *(int*)p4);
//	printf("虚函数地址:%p\n", &Base::fun1);
//	printf("普通函数地址:%p\n", &Base::func5);
//
//	return 0;
//}